#include "../inc/page.h"
#include <iostream>

// 全局的 PageManager 对象
PageManager page_manager;

// Page::Page(lv_obj_t* prev)
// {
//   printf("UI:page constructor\n");
//   this->prev = prev;
//   this_object = lv_obj_create(NULL);
//   lv_obj_clear_flag(this_object, LV_OBJ_FLAG_SCROLLABLE);      /// Flags
//   lv_obj_set_flex_flow(this_object, LV_FLEX_FLOW_ROW);
//   lv_obj_set_flex_align(this_object, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_START);
//   lv_obj_set_style_bg_color(this_object, lv_color_hex(THEME_COLOR_PAGE_BACKGROUND), LV_PART_MAIN | LV_STATE_DEFAULT);
//   lv_obj_set_style_bg_opa(this_object, 255, LV_PART_MAIN | LV_STATE_DEFAULT);

// }

// Page::Page(UI_Object* prev)
// {
//   Page(prev->get_lv_obj_t());
// }

// Page 构造函数
Page::Page()
{
  printf("UI:page constructor\n");

  // 创建一个 LVGL 对象作为页面容器
  this_object = lv_obj_create(NULL);

  // 禁用滚动功能
  lv_obj_clear_flag(this_object, LV_OBJ_FLAG_SCROLLABLE);

  // 设置 Flex 布局为垂直方向
  lv_obj_set_flex_flow(this_object, LV_FLEX_FLOW_COLUMN);

  // 设置 Flex 布局的对齐方式为居中
  lv_obj_set_flex_align(this_object, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);

  // 设置页面的背景颜色为主题定义的页面背景颜色
  lv_obj_set_style_bg_color(this_object, lv_color_hex(THEME_COLOR_PAGE_BACKGROUND), LV_PART_MAIN | LV_STATE_DEFAULT);

  // 设置背景不透明度为完全不透明
  lv_obj_set_style_bg_opa(this_object, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
}

// Page 析构函数
Page::~Page()
{
  // if (this->prev != NULL)
  // {
  //   lv_disp_load_scr(this->prev);
  //   return;
  // }
  // printf("UI:page prev is NULL,can not back\n");
}

// 显示页面
void Page::show()
{
  // 加载当前页面到屏幕上
  lv_disp_load_scr(this_object);
  // printf("UI:page show\n");
}

// PageManager 构造函数
PageManager::PageManager()
{
  // 构造函数内容为空
}

// PageManager 析构函数
PageManager::~PageManager()
{
  // 析构函数内容为空
}

// 添加根页面
void PageManager::add_root_page(Page* page)
{
  // 创建根页面项
  this->root_page_item = new PageItem();
  this->root_page_item->name = new std::string("root");
  this->root_page_item->this_page = page;
  this->root_page_item->parent_page_item = NULL;
  // this->root_page_item->children = map<string, PageItem*>();

  // 将根页面项添加到页面映射中
  this->page_map.insert(std::pair<std::string, PageItem*>(std::string("root"), root_page_item));

  // 设置当前页面项为根页面项
  this->now_page_item = root_page_item;
}

// 添加主页面
void PageManager::add_main_page(Page* page)
{
  // 创建主页面项
  PageItem* main_page_item = new PageItem();
  main_page_item->name = new std::string("main");
  main_page_item->this_page = page;
  main_page_item->parent_page_item = root_page_item;

  // 将主页面项添加到根页面项的子页面列表中
  root_page_item->children.push_back(main_page_item);

  // 将主页面项添加到页面映射中
  this->page_map.insert(std::pair<std::string, PageItem*>(std::string("main"), main_page_item));
}

// 显示页面结构
void PageManager::display_page_structure()
{
  printf("\n####PageManager::display_page_structure###\n");
  printf("|_:%s(root)\n", root_page_item->name->c_str());

  // 遍历根页面项的子页面项
  for (auto it = root_page_item->children.begin(); it != root_page_item->children.end(); ++it)
  {
    printf(" |_:%s\n", (*it)->name->c_str());

    // 遍历子页面项的子页面项
    for (auto it2 = (*it)->children.begin(); it2 != (*it)->children.end(); ++it2)
    {
      printf("  |_:%s\n", (*it2)->name->c_str());

      // 遍历子页面项的子页面项的子页面项
      for (auto it3 = (*it2)->children.begin(); it3 != (*it2)->children.end(); ++it3)
      {
        printf("   |_:%s\n", (*it3)->name->c_str());
      }
    }
  }
}

// 添加子页面
bool PageManager::add_child_page(const char* parent_name, const char* child_name, Page* child_page)
{
  // 创建子页面项
  PageItem* page_item = new PageItem();
  page_item->name = new std::string(child_name);
  page_item->this_page = child_page;

  // 查找父页面项
  PageItem* parent = this->page_map[std::string(parent_name)];

  // 检查父页面项是否存在
  if (parent == NULL || parent == nullptr)
  {
    printf("PageManager::add_child_page: parent page not found\n");
    return false;
  }

  // 设置子页面项的父页面项
  page_item->parent_page_item = parent;

  // 将子页面项添加到父页面项的子页面列表中
  parent->children.push_back(page_item);

  // 将子页面项添加到页面映射中
  this->page_map.insert(std::pair<std::string, PageItem*>(std::string(child_name), page_item));

  return true;
}

// 加载页面
bool PageManager::load_page(const char* page_name)
{
  printf("PageManager::load_page: %s\n", page_name);

  // 查找页面项
  PageItem* page_item = this->page_map[std::string(page_name)];

  // 检查页面项是否存在
  if (page_item == NULL || page_item == nullptr)
  {
    printf("PageManager::load_page: page not found\n");
    return false;
  }

  // 显示页面
  page_item->this_page->show();

  // 设置当前页面项为加载的页面项
  this->now_page_item = page_item;

  return true;
}

// 返回上一页面
void PageManager::page_back()
{
  printf("PageManager::page_back\n");

  // 获取当前页面项
  PageItem* now_page_item = this->now_page_item;

  // 获取父页面项
  PageItem* parent_page_item = now_page_item->parent_page_item;

  // 检查父页面项是否为根页面项或为空
  if (parent_page_item == this->root_page_item || parent_page_item == NULL || parent_page_item == nullptr)
  {
    return;
  }

  // 设置当前页面项为父页面项
  this->now_page_item = parent_page_item;

  // 显示父页面
  parent_page_item->this_page->show();
}

// AppPage 构造函数
AppPage::AppPage(Page* parent)
{
  // 设置父页面
  this->parent = parent;

  // 设置手势事件回调函数
  this->set_event_cb([](lv_event_t* e) {
    // 获取手势方向
    lv_dir_t dir = lv_indev_get_gesture_dir(lv_indev_get_act());


    if (dir == LV_DIR_TOP) {
      // 获取 AppPage 对象
      AppPage* app_page = (AppPage*) e->user_data;

      // 显示父页面
      app_page->parent->show();

      // 删除当前 AppPage 对象
      delete app_page;
    }
  }, LV_EVENT_GESTURE, this);
}

// AppPage 析构函数
AppPage::~AppPage()
{
  // 析构函数内容为空
}